package br.ufrpe.bsi.pvs.database.funcionario;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.ufrpe.bsi.pvs.database.Conexao;
import br.ufrpe.bsi.pvs.model.funcionario.Funcionario;

/**
 * @author Thays
 *
 */
public class FuncionarioDAOImpl implements FuncionarioDAO {

	// Verifica o login a partir do login do usuario.
	@Override
	public Funcionario login(String login, String senha) {
		Funcionario funcionario = new Funcionario();
		Connection conn = null;
		PreparedStatement stm = null;
		ResultSet rs = null;

		String sqlSelect = "SELECT * FROM funcionario WHERE login = ? and senha = ?";
		conn = Conexao.getConnection();
		try {
			stm = conn.prepareStatement(sqlSelect);

			stm.setString(1, login);
			stm.setString(2, senha);

			rs = stm.executeQuery(sqlSelect);

			// se a ID existir, entao o metodo retorna o funcionario.
			if (rs.next()) {
	 
				stm.close();
				return funcionario;
			}

			// se a ID nao existir, entao retorna nulo.
			else {
	 
				stm.close();
				return null;
			}

		} catch (SQLException e) {
			System.err.println("[CANT LOGIN] " + e);
		} finally {
			if (stm != null) {
				try {
					stm.close();
				} catch (SQLException e1) {
					System.out.print(e1.getStackTrace());
				}
			}
		}
		return null;
	}

	@Override
	public void salvar(Funcionario object) {
		String insert = "INSERT INTO funcionario (nome, login, senha) VALUES (?, ?, ?)";
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con.prepareStatement(insert);
			ps.setString(1, object.getNome());
			ps.setString(2, object.getLogin());
			ps.setString(3, object.getSenha());

			ps.execute();
			ps.close();
		} catch (Exception e) {
			System.err.println("[ADD PROBLEM] cant add funcionario: " + e);
		}
	}

	@Override
	public void remover(Funcionario object) {
		remover(object.getId());
	}

	@Override
	public void remover(Serializable id) {
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("DELETE FROM funcionario WHERE id = ?");
			ps.setInt(1, (Integer) id);

			ps.execute();
			ps.close();
		} catch (Exception e) {
			System.err.println("[DEL PROBLEM] cant del funcionario: " + e);
		}
	}

	@Override
	public List<Funcionario> listar() {
		List<Funcionario> funcionarios = new ArrayList<>();
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("SELECT * FROM pvs.funcionario");
			ResultSet rs = ps.executeQuery();
			while (rs.next())
				funcionarios.add(buildFuncionario(rs));
 
			ps.close();
		} catch (Exception e) {
			System.err.println("[LIST PROBLEM] cant list funcionario: " + e);
		}

		return funcionarios;
	}

	@Override
	public Funcionario pesquisar(Serializable id) {
		Funcionario f = null;
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("SELECT * FROM funcionario WHERE id = ?");
			ps.setInt(1, (Integer) id);

			ResultSet rs = ps.executeQuery();

			while (rs.next())
				f = buildFuncionario(rs);
 
			ps.close();
		} catch (Exception e) {
			System.out.println("[DB ERROR] cant found funcionario id: " + id);
		}

		return f;
	}

	@Override
	public Funcionario pesquisar(String name) {
		Funcionario f = null;
		try (Connection con = Conexao.getConnection()) {
			PreparedStatement ps = con
					.prepareStatement("SELECT * FROM funcionario WHERE nome = ?");
			ps.setString(1, name);

			ResultSet rs = ps.executeQuery();

			while (rs.next())
				f = buildFuncionario(rs);
 
			ps.close();
		} catch (Exception e) {
			System.out.println("[DB ERROR] cant found funcionario name: "
					+ name);
		}

		return f;
	}

	// esse metodo ira adicionar a um objeto funcionario o resultado da
	// pesquisa.
	private Funcionario buildFuncionario(ResultSet rs) throws Exception {
		Funcionario func = new Funcionario();

		func.setNome(rs.getString("nome"));
		func.setLogin(rs.getString("login"));
		func.setSenha(rs.getString("senha"));

		return func;
	}

}
